unit articoli_frm;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, db, FileUtil, LResources, Forms, Controls, Graphics,
  Dialogs, StdCtrls, ExtCtrls, DbCtrls, ComCtrls, DBGrids, ZDataset,
  ZConnection, datamodule_frm, EditBtn, TreeListView;

type

  { Tarticoli }

  Tarticoli = class(TForm)
    btaddman: TButton;
    btdelman: TButton;
    btelimina: TButton;
    bteliminaext: TButton;
    btimage: TButton;
    btnuovo: TButton;
    btnuovoext: TButton;
    btsalva: TButton;
    btsalvaext: TButton;
    bttemplate: TButton;
    cbArticoli: TComboBox;
    cbpianomanutenzioni: TComboBox;
    cbtemplate: TComboBox;
    cbtipoarticolo: TComboBox;
    ds_ext: TDatasource;
    ds_piani: TDatasource;
    edcampo: TLabeledEdit;
    eddataacquisto: TDateEdit;
    edDescrizione: TMemo;
    edgruppo: TLabeledEdit;
    edimage: TLabeledEdit;
    edmarca: TLabeledEdit;
    edmodello: TLabeledEdit;
    edNome: TLabeledEdit;
    edvalore: TLabeledEdit;
    grigliacampi: TDBGrid;
    grigliapiani: TDBGrid;
    Image1: TImage;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    edserialnumber: TLabeledEdit;
    Label4: TLabel;
    Marca: TLabeledEdit;
    Modello: TLabeledEdit;
    LabeledEdit3: TLabeledEdit;
    lblcbarticoli: TLabel;
    lblDescrizione: TLabel;
    lblNote: TLabel;
    lbPianoManutenzioni: TLabel;
    ListCatGer: TListBox;
    listcatparent: TTreeListView;
    OpenDialog1: TOpenDialog;
    PageControl1: TPageControl;
    Panel1: TPanel;
    Panel2: TPanel;
    Panel3: TPanel;
    Panel4: TPanel;
    Panel5: TPanel;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    TabSheet3: TTabSheet;
    zq_piani: TZQuery;
    zq_ext: TZQuery;
    zq_articoli: TZQuery;
    procedure btdelmanClick(Sender: TObject);
    procedure bteliminaClick(Sender: TObject);
    procedure bteliminaextClick(Sender: TObject);
    procedure btimageClick(Sender: TObject);
    procedure btnuovoClick(Sender: TObject);
    procedure btnuovoextClick(Sender: TObject);
    procedure btsalvaClick(Sender: TObject);
    procedure btsalvaextClick(Sender: TObject);
    procedure bttemplateClick(Sender: TObject);
    procedure btaddmanClick(Sender: TObject);
    procedure cbArticoliChange(Sender: TObject);
    procedure cbArticoliExit(Sender: TObject);
    procedure cbArticoliKeyPress(Sender: TObject; var Key: char);
    procedure FormShow(Sender: TObject);
    procedure grigliacampiCellClick(Column: TColumn);
    procedure grigliacampiDblClick(Sender: TObject);
    procedure edNomeChange(Sender: TObject);
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    procedure LoadComboArticoli();
    procedure LoadComboTipoArticoli();
    procedure LoadComboCategorieParent();
    procedure LoadComboManutenzioni();
    procedure LoadComboTemplate();
    procedure ClearCampi();
    procedure loadgrigliapiani();
    procedure getcategorychild(categoryparent,level:integer; node:ttreelistitem);
    procedure InsertNextIntervento(id_articolo,id_piano:Integer);
    procedure ModifySQLTable();
  private
    { private declarations }
  public
    { public declarations }
    idarticolo_sel:integer;
  end; 

var
  articoli: Tarticoli;
implementation

{ Tarticoli }


procedure Tarticoli.FormShow(Sender: TObject);
begin
  //Aggiungo campi alla tabella ANAGARTICOLI se mancanti
  ModifySQLTable();

  //seleziono tutti gli articoli e li visualizzo nella combobox
  LoadComboArticoli();
  //seleziono eventuali tipi di articoli già creati come suggerimento
  LoadComboTipoArticoli();
  //visualizzo tutte le categorie nelle relative combo
  LoadComboCategorieParent();
  //visualizzo tutte le manutenzioni nella relativa combo
  LoadComboManutenzioni();
  //carico i template nella combo
  LoadComboTemplate();
  cbArticoli.ItemIndex:= cbArticoli.Items.IndexOfObject(TObject(idarticolo_sel));
  cbArticoliChange(self);
end;

procedure Tarticoli.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  CloseAction:=caFree;
end;

procedure Tarticoli.cbArticoliChange(Sender: TObject);
var stream:TMemoryStream;
    flagGerarchica:boolean;
    i:integer;
begin
    stream:=TMemoryStream.Create;
    if cbArticoli.ItemIndex<>-1 then
    begin
         with zq_articoli do
         begin
              Close;
              sql.Clear;
              sql.Add('SELECT * FROM ANAGARTICOLI WHERE IDARTICOLO=:ID');
              ParamByName('ID').AsInteger:=integer(cbArticoli.Items.Objects[cbArticoli.ItemIndex]);
              ExecSQL;
              Open;
              edNome.Text:=FieldByName('NOME').AsString;
              edDescrizione.Text:=FieldByName('DESCRIZIONE').AsString;
              edmarca.Text:=FieldByName('MARCA').AsString;
              edmodello.Text:=FieldByName('MODELLO').AsString;
              edserialnumber.Text:=FieldByName('SNUMBER').AsString;
              eddataacquisto.Text:=FieldByName('DATA_ACQUISTO').AsString;
              //cbpianomanutenzioni.ItemIndex:= cbpianomanutenzioni.Items.IndexOfObject(TObject(FieldByName('IDPIANOMANUTENZIONE').AsInteger));
              //CARICARE LISTA PIANI
              if not FieldByName('immagine').IsNull then
              begin
                   TBlobField(FieldByName('immagine')).SaveTostream(stream);
                   stream.Position:=0;
                   Image1.Picture.Jpeg.LoadFromStream(stream);
              end
              else
                  Image1.Picture.Clear;

              stream.free;

              Close;
              sql.Clear;
              sql.Add('SELECT * FROM ARTICOLI_CAT WHERE IDARTICOLO=:ID');
              ParamByName('ID').AsInteger:=integer(cbArticoli.Items.Objects[cbArticoli.ItemIndex]);
              ExecSQL;
              Open;
              ListCatGer.ClearSelection;
              while not EOF do
              begin
                   with ListCatGer do
                   begin
                        FlagGerarchica:=true;
                        for i := -1 + Items.Count downto 0 do
                        begin
                             if (integer(items.Objects[i])=FieldByName('IDCATEGORIA').AsInteger) then
                             begin
                                  Selected[i]:=true;
                                  FlagGerarchica:=false;
                             end


                        end;
                   end;
                   if FlagGerarchica then
                        begin
                             if listcatparent.selCount>0 then listcatparent.Selected.Selected:=false;
                             with listcatparent.Items.FindItemWithRecordText(FieldByName('IDCATEGORIA').Asstring,1) do
                                  Selected:=true;
                             FlagGerarchica:=False;
                        end;

                   Next;
              end;
         end;
         with zq_ext do
         begin
              //seleziono tutti i campi che fanno capo a questo id
              close;
              sql.clear;
              sql.add('SELECT IDARTICOLO_EXT,gruppo,NOME_CAMPO,VALORE FROM ANAGARTICOLI_EXT '+
                      'WHERE IDARTICOLO=:IDART '+
                      'ORDER BY gruppo,NOME_CAMPO');
              ParamByName('IDART').AsInteger:=integer(cbArticoli.Items.Objects[cbArticoli.ItemIndex]);
              ExecSQL;
              open;
         end;
         With grigliacampi do
              begin
                   Columns[0].Visible:=false;
                   Columns[1].Width:=50;
                   Columns[2].Width:=200;
                   Columns[3].Width:=200;
                   Columns[1].Title.Caption:=' ';
                   Columns[2].Title.Caption:='Campo';
                   Columns[3].Title.Caption:='Valore';

              end;
    Panel2.Enabled:=true;
    loadgrigliapiani();
    end;
end;

procedure Tarticoli.cbArticoliExit(Sender: TObject);
begin
     (sender as TComboBox).ItemIndex := (sender as TComboBox).Items.IndexOfObject(TObject((sender as TComboBox).Items.Objects[(sender as TComboBox).ItemIndex])); //(sender as TComboBox).Items.IndexOf((sender as TComboBox).Text);
     (sender as TComboBox).OnChange(self);
end;

procedure Tarticoli.cbArticoliKeyPress(Sender: TObject; var Key: char);
begin
    if key=#13 then
       SelectNext(sender as twincontrol,true,true);
end;

procedure Tarticoli.btnuovoClick(Sender: TObject);
begin
  //pulisce tutti i campi per consentire un nuovo inserimento
  ClearCampi();
  if TabSheet1.Focused then  listCatParent.SetFocus;
end;

procedure Tarticoli.btsalvaClick(Sender: TObject);
var
   id_articolo_inserito,IDCat,i : Integer;
   stream:TMemoryStream;
begin
  //CONTROLLI
  stream:=TMemoryStream.create;
  if listCatParent.selCount=0 then
  begin
     ShowMessage('Devi selezionare una categoria madre.');
     listCatParent.SetFocus;
     Exit();
  end;
  if ednome.Text='' then
  begin
     ShowMessage('Devi indicare almeno il nome dell''articolo.');
     edNome.SetFocus;
     Exit();
  end;

  if cbArticoli.Text<>'' then
  begin
     ////////////////////////////////////////////////////////////////////
     ///              Modifica ARTICOLO
     ////////////////////////////////////////////////////////////////////
     with zq_articoli do
          begin
               Close;
               //Modifica anagrafica articolo
               sql.Clear;
               sql.Add('UPDATE ANAGARTICOLI SET '+
                       'NOME=:NOME,'+
                       'DESCRIZIONE=:DESCRIZIONE,'+
                       'IMMAGINE=:IMMAGINE, '+
                       'MARCA=:MARCA, '+
                       'MODELLO=:MODELLO, '+
                       'SNUMBER=:SNUMBER, '+
                       'DATA_ACQUISTO=:DATA_ACQUISTO '+
                       'WHERE IDARTICOLO=:ID');
               ParamByName('NOME').AsString:=edNome.Text;
               ParamByName('DESCRIZIONE').AsString:=edDescrizione.Text;
               ParamByName('MARCA').AsString:=edmarca.Text;
               ParamByName('MODELLO').AsString:=edmodello.Text;
               ParamByName('SNUMBER').AsString:=edserialnumber.Text;
               ParamByName('DATA_ACQUISTO').AsString:=eddataacquisto.Text;
               ParamByName('ID').AsInteger:=integer(cbArticoli.Items.Objects[cbArticoli.ItemIndex]);
               if not Image1.Picture.Jpeg.Empty then
               begin
                   Image1.Picture.SaveToStreamWithFileExt(stream,'jpg');
                   ParamByName('immagine').LoadFromStream(stream,ftblob);
               end
               else
                   ParamByName('immagine').IsNull;

               stream.Free;
               ExecSQL;

               //Elimina le vecchie relazioni
               sql.Clear;
               sql.Add('DELETE FROM ARTICOLI_CAT '+
                       'WHERE IDARTICOLO=:ID');
               ParamByName('ID').AsInteger:=integer(cbArticoli.Items.Objects[cbArticoli.ItemIndex]);
               ExecSQL;

               //Inserisci relazione articolo-categoria gerarchica (può essere una sola)
               sql.Clear;
               sql.Add('INSERT INTO ARTICOLI_CAT ('+
                       'IDARTICOLO,'+
                       'IDDITTA,' +
                       'IDCATEGORIA'+
                       ') VALUES (:IDARTICOLO,:IDDITTA,:IDCATEGORIA)');
               ParamByName('IDARTICOLO').AsInteger:=integer(cbArticoli.Items.Objects[cbArticoli.ItemIndex]);
               ParamByName('IDDITTA').AsInteger:=DataModule1.idditta;
               ParamByName('IDCATEGORIA').AsInteger:=strtoint(listcatparent.Selected.RecordItemsText[1]);
               ExecSQL;

               //Inserisci relazione articolo-categorie non gerarchiche (potrebbe essere più d'una)
               with ListCatGer do
               begin
                    for i := -1 + Items.Count downto 0 do
                    if Selected[i] then
                    begin
                         IDCat := integer(items.Objects[i]);
                         sql.Clear;
                         sql.Add('INSERT INTO ARTICOLI_CAT ('+
                                 'IDARTICOLO,'+
                                 'IDDITTA,'+
                                 'IDCATEGORIA'+
                                 ') VALUES (:IDARTICOLO,:IDDITTA,:IDCATEGORIA)');
                         ParamByName('IDARTICOLO').AsInteger:=integer(cbArticoli.Items.Objects[cbArticoli.ItemIndex]);
                         ParamByName('IDDITTA').AsInteger:=DataModule1.idditta;
                         ParamByName('IDCATEGORIA').AsInteger:=IDCat;
                         ExecSQL;
                    end;
               end;

               LoadComboArticoli();
               //comunica l'esito positivo della modifica
               ShowMessage(ednome.Text+ ' è stato modificato correttamente.');
          end;
  end
  else
  begin
     ////////////////////////////////////////////////////////////////////
     ///              INSERIMENTO articoli
     ////////////////////////////////////////////////////////////////////
     with zq_articoli do
     begin
          Close;
          //Inserimento anagrafica articolo
          sql.Clear;
          sql.Add('INSERT INTO ANAGARTICOLI ('+
                     'IDDITTA,'+
                     'NOME,'+
                     'DESCRIZIONE,'+
                     'IMMAGINE, '+
                     'MARCA, '+
                     'MODELLO, '+
                     'SNUMBER, '+
                     'DATA_ACQUISTO '+
                     ') VALUES (:IDDITTA,:NOME,:DESCRIZIONE,:IMMAGINE,:MARCA,:MODELLO,:SNUMBER,:DATA_ACQUISTO)');
          ParamByName('NOME').AsString:=edNome.Text;
          ParamByName('IDDITTA').Asinteger:=DataModule1.idditta;
          ParamByName('DESCRIZIONE').AsString:=edDescrizione.Text;
          ParamByName('MARCA').AsString:=edmarca.Text;
          ParamByName('MODELLO').AsString:=edmodello.Text;
          ParamByName('SNUMBER').AsString:=edserialnumber.Text;
          ParamByName('DATA_ACQUISTO').AsString:=eddataacquisto.Text;
          if not Image1.Picture.Jpeg.Empty then
          begin
               Image1.Picture.SaveToStreamWithFileExt(stream,'jpg');
               ParamByName('immagine').LoadFromStream(stream,ftblob);
          end
          else
               ParamByName('immagine').IsNull;

          stream.Free;
          ExecSQL;

          //Recupera ID Articolo appena inserito per tabella relazioni articoli-categorie
          sql.Clear;
          sql.Add('SELECT MAX(IDARTICOLO) AS IDARTCORRENTE FROM ANAGARTICOLI');
          ExecSQL;
          Open;
          id_articolo_inserito := FieldByName('IDARTCORRENTE').AsInteger;

          //Inserisci relazione articolo-categoria non gerarchica (può essere una sola)
          sql.Clear;
          sql.Add('INSERT INTO ARTICOLI_CAT ('+
              'IDARTICOLO,'+
              'IDDITTA,'+
              'IDCATEGORIA'+
              ') VALUES (:IDARTICOLO,:IDDITTA,:IDCATEGORIA)');
          ParamByName('IDARTICOLO').AsInteger:=id_articolo_inserito;
          ParamByName('IDDITTA').AsInteger:=DataModule1.idditta;
          ParamByName('IDCATEGORIA').AsInteger:=strtoint(listcatparent.Selected.RecordItemsText[1]);
          ExecSQL;

          //Inserisci relazione articolo-categorie gerarchiche (potrebbe essere più d'una)
          with ListCatGer do
          begin
               for i := -1 + Items.Count downto 0 do
               if Selected[i] then
               begin
                    IDCat := integer(items.Objects[i]);
                    sql.Clear;
                    sql.Add('INSERT INTO ARTICOLI_CAT ('+
                        'IDARTICOLO,'+
                        'IDDITTA,'+
                        'IDCATEGORIA'+
                        ') VALUES (:IDARTICOLO,:IDDITTA,:IDCATEGORIA)');
                    ParamByName('IDARTICOLO').AsInteger:=id_articolo_inserito;
                    ParamByName('IDDITTA').AsInteger:=DataModule1.idditta;
                    ParamByName('IDCATEGORIA').AsInteger:=IDCat;
                    ExecSQL;
               end;
          end;
          LoadComboArticoli();

          //comunica l'esito positivo dell'inserimento
          ShowMessage(edNome.Text+' è stato creato correttamente.');
     end;
   end;
   //btnuovoClick(self);
end;

procedure Tarticoli.bteliminaClick(Sender: TObject);
var
  buttonSelected : Integer;
begin
   //CONTROLLI
   if cbArticoli.ItemIndex=-1 then
   begin
        ShowMessage('Per eliminare un articolo è necessario prima selezionarne uno dalla lista.');
        exit();
   end;

    buttonSelected := MessageDlg('Si sta per eliminare l''articolo '+cbArticoli.Text+'. Continuare?',mtInformation, mbOKCancel, 0);
    if buttonSelected = mrOK     then
    begin
         with zq_articoli do
         begin
              Close;
              sql.Clear;
              sql.Add('DELETE FROM ANAGARTICOLI WHERE IDARTICOLO=:ID');
              ParamByName('ID').AsInteger:=integer(cbArticoli.Items.Objects[cbArticoli.ItemIndex]);
              ExecSQL;

              Close;
              sql.Clear;
              sql.Add('DELETE FROM ARTICOLI_CAT WHERE IDARTICOLO=:ID');
              ParamByName('ID').AsInteger:=integer(cbArticoli.Items.Objects[cbArticoli.ItemIndex]);
              ExecSQL;
         end;
         LoadComboArticoli();
         //pulisce tutti i campi
         ClearCampi();
    end
end;

procedure Tarticoli.ClearCampi();
 begin
  cbArticoli.ClearSelection;
  if listcatparent.selCount>0 then listcatparent.Selected.Selected:=false;
  ListCatGer.ClearSelection;
  edNome.Clear;
  edDescrizione.Clear;
  edimage.Clear;
  edmarca.Clear;
  edmodello.Clear;
  edserialnumber.Clear;
  eddataacquisto.Clear;
  Image1.Picture.Clear;
  btsalva.Enabled:=false;
  edcampo.Clear ;
  edvalore.Clear;
  zq_ext.Close;
  cbtemplate.ClearSelection;
  Panel2.Enabled:=false;
  bteliminaext.Enabled:=false;
  cbpianomanutenzioni.ClearSelection;
end;

procedure Tarticoli.LoadComboArticoli();
begin
//svuota combo
cbArticoli.Clear;
with zq_articoli do
        begin
             Close;
             sql.Clear;
             sql.Add('SELECT IDARTICOLO, NOME FROM ANAGARTICOLI');
             ExecSQL;
             Open;
             while not EOF do
             begin
                  cbArticoli.Items.AddObject(FieldByName('NOME').AsString,TObject(FieldByName('IDARTICOLO').AsInteger));
                  Next;
             end;
        end
end;

procedure Tarticoli.ModifySQLTable();
begin
     with zq_articoli do
     begin
          try
             SQL.clear;
             SQL.add('ALTER TABLE ANAGARTICOLI ADD MARCA VARCHAR(255) NULL');
             ExecSQL;
          except
          end;
          try
             SQL.clear;
             SQL.add('ALTER TABLE ANAGARTICOLI ADD MODELLO VARCHAR(255) NULL');
             ExecSQL;
          except
          end;
          try
             SQL.clear;
             SQL.add('ALTER TABLE ANAGARTICOLI ADD SNUMBER VARCHAR(50) NULL');
             ExecSQL;
          except
          end;
          try
             SQL.clear;
             SQL.add('ALTER TABLE ANAGARTICOLI ADD DATA_ACQUISTO VARCHAR(50) NULL');
             ExecSQL;
          except
          end;
     end;
end;


////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
//////////////////    TAB ANAGRAFICA                   /////////////////////////////
////////////////////////////////////////////////////////////////////////////////////

procedure Tarticoli.btimageClick(Sender: TObject);
begin
    if OpenDialog1.Execute then
     begin
          edimage.Text:=OpenDialog1.FileName;
          Image1.Picture.LoadFromFile(edimage.Text);
     end;
end;

procedure Tarticoli.edNomeChange(Sender: TObject);
begin
  btsalva.Enabled:=true;
end;

procedure Tarticoli.LoadComboTipoArticoli();
begin
//svuota combo
cbTipoArticolo.Clear;
with zq_articoli do
        begin
             Close;
             sql.Clear;
             sql.Add('SELECT DISTINCT (TIPOARTICOLO) FROM ANAGARTICOLI WHERE TIPOARTICOLO<>''''');
             ExecSQL;
             Open;
             while not EOF do
             begin
                  cbTipoArticolo.Items.Add(FieldByName('TIPOARTICOLO').AsString);
                  Next;
             end;
        end
end;

procedure Tarticoli.LoadComboCategorieParent();
begin
//svuota combo
listCatParent.items.Clear;
//svuotare listbox
ListCatGer.Clear;
getcategorychild(0,1, nil);
end;

procedure Tarticoli.getcategorychild(categoryparent,level:integer; node:ttreelistitem);
var dataset1 :TZQuery;
nodo:ttreelistitem;
begin
//creo il dataset
dataset1:=TZQuery.Create(self);
dataset1.Connection:=DataModule1.ZConnection1;
with dataset1 do
     begin
          sql.clear;
          sql.add('SELECT ID_CATEGORIA_PARENT, ID_CATEGORIA_CHILD, IDCATEGORIA, NOME, GERARCHICA FROM CATEGORIE_REL, CATEGORIE');
          SQL.ADD('WHERE CATEGORIE_REL.ID_CATEGORIA_CHILD=CATEGORIE.IDCATEGORIA');
          SQL.ADD('AND ID_CATEGORIA_PARENT=:IDPARENT');
          SQL.ADD('ORDER BY ID_CATEGORIA_CHILD ASC');
          ParamByName('IDPARENT').AsInteger:=categoryparent;
          ExecSQL;
          open;
          first;
          while not EOF do
                begin
                    if fieldbyname('gerarchica').AsBoolean then
                       begin
                            nodo:=listcatparent.Items.Add(node,  FieldByName('nome').AsString) ;
                            nodo.RecordItems.Add(FieldByName('idcategoria').Asstring);
                       end

                    else
                       ListCatGer.Items.AddObject(StringOfChar(' ', 2*level) + fieldbyname('nome').AsString,TObject(fieldbyname('idcategoria').AsInteger));

                    getcategorychild(fieldbyname('id_categoria_child').Asinteger,level+1, nodo);
                    next;
                end;
          close;
     end;
dataset1.Destroy;
end;


////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
//////////////////    TAB DATI CUSTOM                  /////////////////////////////
////////////////////////////////////////////////////////////////////////////////////

procedure Tarticoli.btnuovoextClick(Sender: TObject);
begin
// deseleziono i record delle estensioni
  //cambio la caption del pulsante per salvare
  //refresho la griglia e pulisco i campi
  zq_ext.Refresh;
  edcampo.Clear;
  edvalore.Clear;
  edgruppo.Clear;
  btsalvaext.Caption:='Aggiungi';
  bteliminaext.Enabled:=false;
end;

procedure Tarticoli.btsalvaextClick(Sender: TObject);
begin
  //controllo che nome_campo sia valorizzato
  if edcampo.Text='' then
     begin
          ShowMessage('Valorizzare "Campo"');
          Exit();
     end;
  if edgruppo.Text='' then
     begin
          ShowMessage('Valorizzare "Gruppo"');
          Exit();
     end;
  //salvo o modifico il campo selezionato
  if btsalvaext.Caption='Salva' then
     begin
          //procedo con il salvataggio della MODIFICA
          with zq_articoli do
               begin
                    close;
                    sql.Clear;
                    sql.add('UPDATE ANAGARTICOLI_EXT ' +
                            'SET NOME_CAMPO=:NOME, VALORE=:VALORE, GRUPPO=:GRUPPO '+
                            'WHERE IDARTICOLO_EXT=:IDARTEXT');
                    ParamByName('NOME').AsString:=edcampo.Text;
                    ParamByName('VALORE').AsString:=edvalore.Text;
                    ParamByName('GRUPPO').AsInteger:=strtoint(edgruppo.Text);
                    ParamByName('IDARTEXT').AsInteger:=zq_ext.FieldByName('idarticolo_ext').AsInteger;
                    ExecSQL;
               end;
     end
  else
      begin
           //procedo con l'INSERIMENTO
            with zq_articoli do
               begin
                    close;
                    sql.Clear;
                    sql.add('INSERT INTO ANAGARTICOLI_EXT ' +
                            '(IDARTICOLO,NOME_CAMPO,VALORE,GRUPPO) '+
                            'VALUES (:IDART,:NOME,:VALORE,:GRUPPO)');
                    ParamByName('NOME').AsString:=edcampo.Text;
                    ParamByName('VALORE').AsString:=edvalore.Text;
                    ParamByName('GRUPPO').AsInteger:=strtoint(edgruppo.Text);
                    ParamByName('IDART').AsInteger:=integer(cbArticoli.Items.Objects[cbArticoli.ItemIndex]);
                    ExecSQL;
               end;
      end;
  //refresho la griglia e pulisco i campi
btnuovoextClick(self);
end;

procedure Tarticoli.bteliminaextClick(Sender: TObject);
begin
if MessageDlg('Si sta per eliminare '+edcampo.Text+' dal database. Continuare?',mtInformation, mbOKCancel, 0)=mrok then
begin

  //cancello il record selezionato
  with zq_articoli do
       Begin
            close;
            sql.Clear;
            sql.add('DELETE from ANAGARTICOLI_EXT '+
                    'WHERE IDARTICOLO_EXT=:IDARTEXT');
            ParamByName('IDARTEXT').AsInteger:=zq_ext.FieldByName('idarticolo_ext').AsInteger;
            ExecSQL;
       end;
  btnuovoextClick(self);
end;
end;

procedure Tarticoli.bttemplateClick(Sender: TObject);
begin
  if edgruppo.Text='' then
     begin
          ShowMessage('Valorizzare "Gruppo"');
          Exit();
     end;
//carico i campi custom del template nell'articolo corrente
if cbTemplate.ItemIndex <>-1 then
   begin
        with zq_articoli do
          begin
               Close;
               sql.Clear;
               sql.Add('INSERT INTO ANAGARTICOLI_EXT (IDARTICOLO,GRUPPO,NOME_CAMPO,VALORE) '+
                       'SELECT :IDART,:GRUPPO,NOME_CAMPO,VALORE FROM ANAGARTICOLI_TEMPL_DATA WHERE IDTEMPLATE=:IDTEMPL');
               ParamByName('IDTEMPL').AsInteger:=integer(cbTemplate.Items.Objects[cbTemplate.ItemIndex]);
               ParamByName('IDART').AsInteger:=  integer(cbArticoli.Items.Objects[cbArticoli.ItemIndex]);
               ParamByName('GRUPPO').AsInteger:=StrToInt(edgruppo.Text);
               ExecSQL;
          end;
     end;
btnuovoextClick(self);
end;

procedure Tarticoli.grigliacampiCellClick(Column: TColumn);
begin
grigliacampiDblClick(self);
end;

procedure Tarticoli.grigliacampiDblClick(Sender: TObject);
begin
  //carico i dati nella form di modifica
 edcampo.Text:=zq_ext.FieldByName('Nome_campo').AsString;
 edvalore.Text:=zq_ext.FieldByName('valore').AsString;
 edgruppo.Text:=zq_ext.FieldByName('Gruppo').AsString;
  //se viene selezionata una cella cambio la caption del pulsante per il salvataggio
  btsalvaext.Caption:='Salva';
  bteliminaext.Enabled:=true;
end;

procedure Tarticoli.LoadComboTemplate();
begin
     cbTemplate.Clear;
     with zq_articoli do
        begin
             Close;
             sql.Clear;
             sql.Add('SELECT IDTEMPLATE, IDDITTA, NOME_TEMPLATE FROM ANAGARTICOLI_TEMPL');
             sql.add('WHERE IDDITTA=:IDDITTA');
             ParamByName('IDdITTA').AsInteger:=DataModule1.idditta;
             ExecSQL;
             Open;
             while not EOF do
             begin
                  //carico il campo NOME di ogni singolo record nella combo di visualizzazione
                  cbTemplate.Items.AddObject(FieldByName('NOME_TEMPLATE').AsString,TObject(FieldByName('IDTEMPLATE').AsInteger));
                  Next;
             end;
        end
end;


////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
//////////////////    TAB MANIUTENZIONI                /////////////////////////////
////////////////////////////////////////////////////////////////////////////////////

procedure Tarticoli.btaddmanClick(Sender: TObject);
begin
//Controllare che il piano non sia già nella lista
with zq_piani do
     begin
          first;
          while not EOF do
                begin
                     if FieldByName('IDPIANO').AsInteger = integer(cbpianomanutenzioni.Items.Objects[cbpianomanutenzioni.ItemIndex]) then
                        begin
                             ShowMessage('Il piano manutenzione scelto è già presente');
                             exit;
                        end;
                     Next;
                end;
          first;
     end;
//inseririre il piano nella tabella
with zq_articoli do
     begin
          close;
          sql.clear;
          sql.add('INSERT INTO ARTICOLI_PIANIMANUTENZIONE (IDARTICOLO,IDPIANO) '+
                  'VALUES (:IDART,:IDPIANO)');
          ParamByName('IDART').AsInteger:=integer(cbArticoli.Items.Objects[cbArticoli.ItemIndex]);
          ParamByName('IDPIANO').Asinteger:=integer(cbpianomanutenzioni.Items.Objects[cbpianomanutenzioni.ItemIndex]);
          ExecSQL;
     end;
//aggiornare la griglia
zq_piani.Refresh;
//schedulare la manutenzione
InsertNextIntervento(integer(cbArticoli.Items.Objects[cbArticoli.ItemIndex]),integer(cbpianomanutenzioni.Items.Objects[cbpianomanutenzioni.ItemIndex]));
end;

procedure Tarticoli.loadgrigliapiani();
begin
with zq_piani do
     begin
          close;
          sql.clear;
          sql.add('SELECT A.IDPIANO, B.NOME ' +
                  'FROM ARTICOLI_PIANIMANUTENZIONE AS A INNER JOIN PIANI_MANUTENZIONI AS B ON A.IDPIANO=B.IDPIANO '+
                  'WHERE A.IDARTICOLO=:IDART');
          ParamByName('IDART').AsInteger:=integer(cbArticoli.Items.Objects[cbArticoli.ItemIndex]);
          ExecSQL;
          Open;
     end;
end;

procedure Tarticoli.btdelmanClick(Sender: TObject);
begin
  //eliminare il piano selezionato
  if grigliapiani.SelectedIndex<>-1 then
     begin
           with zq_articoli do
                Begin
                     close;
                     sql.Clear;
                     sql.add('DELETE from ARTICOLI_PIANIMANUTENZIONE '+
                             'WHERE IDARTICOLO=:IDART '+
                             'AND IDPIANO=:IDPIANO');
                     ParamByName('IDART').AsInteger:=integer(cbArticoli.Items.Objects[cbArticoli.ItemIndex]);
                     ParamByName('IDPIANO').Asinteger:=zq_piani.FieldByName('IDPIANO').AsInteger;
                     ExecSQL;
                end;
           zq_piani.Refresh;
     end
  else
      ShowMessage('Devi selezionare almeno un piano');
end;

procedure Tarticoli.LoadComboManutenzioni();
begin
//svuota combo
cbpianomanutenzioni.Clear;
with zq_articoli do
        begin
             Close;
             sql.Clear;
             sql.Add('SELECT IDPIANO, NOME FROM PIANI_MANUTENZIONI');
             ExecSQL;
             Open;
             while not EOF do
             begin
                  cbpianomanutenzioni.Items.AddObject(FieldByName('NOME').AsString,TObject(FieldByName('IDPIANO').AsInteger));
                  Next;
             end;
        end
end;

procedure Tarticoli.InsertNextIntervento(id_articolo,id_piano:Integer);
var
  intervallo : Integer;
  nextDATAIntervento : TDate;
  tipo:string;
begin
    //Trova il piano manutenzioni dell'articolo
     with zq_articoli do
     begin
          Close;
          sql.Clear;
          sql.Add('SELECT INTERVALLO, UM_INTERVALLO, TIPOPIANO FROM PIANI_MANUTENZIONI ');
          sql.Add('WHERE IDPIANO = :ID');
          ParamByName('ID').AsInteger:=id_piano;
          ExecSQL;
          Open;
          tipo:=FieldByName('TIPOPIANO').AsString;
          case FieldByName('UM_INTERVALLO').AsInteger  of
               0 : intervallo:= FieldByName('INTERVALLO').AsInteger;  //giorni
               1 : intervallo:= FieldByName('INTERVALLO').AsInteger*30;  //mesi
               2 : intervallo:= FieldByName('INTERVALLO').AsInteger*365;  //anni
               else intervallo:= FieldByName('INTERVALLO').AsInteger; //giorni
          end;
     end;
     nextDATAIntervento:=Date+intervallo;
     if MessageDlg('Vuoi inserire il primo intervento manutenzione, che secondo il piano di '+
                       'manutenzione associato all''articolo, partendo da oggi, avrà scadenza il : '+
                       DateToStr(nextDATAIntervento) + '?',mtInformation, mbOKCancel, 0)= mrOK     then
        with zq_articoli do
          begin
               Close;
               sql.Clear;
               sql.Add('INSERT INTO INTERVENTI_MANUTENZIONI ('+
                       'IDPIANO,'+
                       'IDDITTA,'+
                       'IDARTICOLO,'+
                       'TIPOINTERVENTO,'+
                       'DATA_ESEGUITO,'+
                       'DATA_SCADENZA,'+
                       'DATA_REGISTRAZIONE,'+
                       'COMPLETATO,'+
                       'OPERATORE,'+
                       'NOTE'+
                       ') VALUES (:IDPIANO,:IDDITTA,:IDARTICOLO,:TIPO,:DATA_ESEGUITO,:DATA_SCADENZA,:DATA_REGISTRAZIONE,:COMPLETATO,:OPERATORE,:NOTE)');
               ParamByName('IDPIANO').AsInteger:=id_piano;
               ParamByName('IDDITTA').AsInteger:=DataModule1.idditta;
               ParamByName('IDARTICOLO').Asinteger:=id_articolo;
               ParamByName('TIPO').AsString:=tipo;
               ParamByName('DATA_ESEGUITO').AsDate:=NullDate;
               ParamByName('DATA_SCADENZA').AsDate:=nextDATAIntervento;
               ParamByName('DATA_REGISTRAZIONE').asDate:=Date;
               ParamByName('COMPLETATO').AsInteger:=0;
               ParamByName('OPERATORE').AsString:=DataModule1.username;
               ParamByName('NOTE').AsString:='Intervento inserito automaticamente il ' + DateToStr(Date);
               ExecSQL;
               //comunica l'esito positivo dell'inserimento
               ShowMessage('L''intervento con scadenza '+DateToStr(nextDATAIntervento)+ ' è stato inserito correttamente.');
          end;
end;


initialization
  {$I articoli_frm.lrs}

end.

